<?php

/**
 * Class de gestion de la connexion et des sessions
 *
 * @version 1.0
 * @author Remi
 */
class ConnHisto
{

    /**
     * @var int
     */
    protected $IdConnHisto;
    /**
     * @var int
     */
    protected $IdMembre;
    /**
     * @var int
     */
    protected $DateConn;
    /**
     * @var string
     */
    protected $HostConn;
    /**
     * @var string
     */
    protected $ClientConn;
    /**
     * @var string
     */
    protected $SessId;
    /**
     * @var bool
     */
    public $requeteOk;
    /**
     * @var string
     */
    public $errormsg;

    /**
     *
     * @param int $myVar Id de la connection
     */
    public function __construct($myVar)
    {

        if (empty($myVar))
        {
            $this->IdConnHisto = 0;
            $this->IdMembre = 0;
            $this->DateConn = 0;
            $this->HostConn = "";
            $this->ClientConn = "";
            $this->SessId = "";
            $this->requeteOk = true;
            $this->errormsg = "";
        }
        else
        {
            //Instanciation connexion PDO
            $sql = SQL::getInstance()->getConnection();
            //On retourne l'entree demandee
            $query = 'SELECT ConnHisto.* FROM ConnHisto WHERE ConnHisto.IdConnHisto = :id';
            $c = $sql->prepare($query);
            $c->bindParam(':id', $myVar, PDO::PARAM_INT);
            //Execution de la requête retourne false si echec
            if ($c->execute())
            {
                $result = $c->fetch(PDO::FETCH_OBJ);
                if (!empty($result))
                {
                    $this->IdConnHisto = $result->IdConnHisto;
                    $this->IdMembre = $result->IdMembre;
                    $this->DateConn = $result->DateConn;
                    $this->HostConn = $result->HostConn;
                    $this->ClientConn = $result->ClientConn;
                    $this->SessId = $result->SessID;
                }
                else
                {
                    $this->requeteOk = false;
                    $this->errormsg = "Cette connexion n'existe pas !";
                }
            }
            else
            {
                //Recuperation de l'erreur dans la variable de classe
                /*
                  Pour chaque new avec passage de paramètres vous pouvez savoir si vous avez bien un resultat, si false n'oubliez pas de gerez l'affichage du message,...
                 */
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
            }
        }
    }

    /**
     * Obtenir une connexion avec un id de session php, met a jour l'objet
     *
     * @param string $mySID represente le SID de l'utilisateur
     */
    public function getConnHistoBySID($mySID)
    {
        $sql = SQL::getInstance()->getConnection();
        //On retourne l'entree demandee
        $query = 'SELECT ConnHisto.* FROM ConnHisto WHERE ConnHisto.SessId = :id';
        $c = $sql->prepare($query);
        $c->bindParam(':id', $mySID, PDO::PARAM_STR);
        //Execution de la requête retourne false si echec

        if ($c->execute())
        {
            $result = $c->fetch(PDO::FETCH_OBJ);
            if (!empty($result))
            {
                $this->IdConnHisto = $result->IdConnHisto;
                $this->IdMembre = $result->IdMembre;
                $this->DateConn = $result->DateConn;
                $this->HostConn = $result->HostConn;
                $this->ClientConn = $result->ClientConn;
                $this->SessId = $result->SessId;
                $this->requeteOk = true;
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = "Cette connexion n'existe pas !";
            }
        }
        else
        {
            //Recuperation de l'erreur dans la variable de classe
            /*
              Pour chaque new avec passage de paramètres vous pouvez savoir si vous avez bien un resultat, si false n'oubliez pas de gerez l'affichage du message,...
             */
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
        }
    }

    /**
     * Cree une connection dans la bd
     */
    public function insertConnHisto()
    {
        $sql = SQL::getInstance()->getConnection();
        $query =
                'INSERT INTO
			ConnHisto (IdMembre,HostConn,ClientConn,SessId,DateConn)																			
			VALUES(:idM,:HostCnn,:ClientCnn,:IdSess,:DateConn)';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);
            $c->bindParam(':idM', $this->IdMembre, PDO::PARAM_INT);
            $c->bindParam(':HostCnn', $this->HostConn, PDO::PARAM_STR);
            $c->bindParam(':ClientCnn', $this->ClientConn, PDO::PARAM_STR);
            $c->bindParam(':IdSess', $this->SessId, PDO::PARAM_STR);
            $c->bindParam(':DateConn', $this->DateConn, PDO::PARAM_INT);

            if ($c->execute())
            {
                $this->IdConnHisto = $sql->lastInsertId();
                $this->requeteOk = true;
                $this->errormsg = "";
                $sql->commit();
                $c->closeCursor();
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
            }
        }
        catch (PDOException $Exception)
        {

            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
            $this->IdConnHisto = 0;
        }
    }

    /**
     * Met à jour la connection
     */
    public function updateConnHisto()
    {
        $sql = SQL::getInstance()->getConnection();
        $query =
                'UPDATE ConnHisto
			SET 
			IdMembre = :idM,
			HostConn = :HostCnn,
			ClientConn =:ClientCnn ,
			SessId = :IdSess,
			DateConn = :DateCnn
			WHERE IdConnHisto = :id';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);
            $c->bindParam(':idM', $this->IdMembre, PDO::PARAM_INT);
            $c->bindParam(':HostCnn', $this->HostConn, PDO::PARAM_STR);
            $c->bindParam(':ClientCnn', $this->ClientConn, PDO::PARAM_STR);
            $c->bindParam(':IdSess', $this->SessId, PDO::PARAM_STR);
            $c->bindParam(':id', $this->IdConnHisto, PDO::PARAM_INT);
            $c->bindParam(':DateCnn', $this->DateConn);
            if ($c->execute())
            {
                $this->requeteOk = true;
                $this->errormsg = "";
                $sql->commit();
                $c->closeCursor();
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
            }
        }
        catch (PDOException $Exception)
        {
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
        }
    }

    /**
     * Supprime la session
     */
    public function closeSession()
    {
        $sql = SQL::getInstance()->getConnection();
        $query = 'DELETE FROM ConnHisto WHERE IdConnHisto = :id';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);
            $c->bindParam(':id', $this->IdConnHisto, PDO::PARAM_INT);

            $c->execute();
            $sql->commit();
            $c->closeCursor();
            $this->requeteOk = true;
            $this->errormsg = "";
        }
        catch (PDOException $Exception)
        {
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
        }
    }

    /**
     * Verifie les sessions et leurs temps de connection
     */
    public function cleanSession()
    {
        $sql = SQL::getInstance()->getConnection();

        //on intitalise le timer qui va comparer les timestamp
        $limit = time() - SESSION_TIMEOUT;
        $query = 'DELETE FROM ConnHisto WHERE DateConn < :limited';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);
            $c->bindParam(':limited', $limit);

            $c->execute();
            $sql->commit();
            $c->closeCursor();
            $this->requeteOk = true;
            $this->errormsg = "";
        }
        catch (PDOException $Exception)
        {
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
        }
    }

    /**
     * Regenere un id de session, met a jour l'objet et recree une entree dans la bdd
     */
    public function regenerateSession()
    {
        session_regenerate_id();
        $this->SessId = session_id();
        $this->insertConnHisto();
    }

    /**
     * Controle de securite de la session
     */
    public function verifSession($ip, $userAgent)
    {
        //On verifie ici si l'ip est la même, si l'user agent le meme
        //Si oui on continue la session
        //Sinon au revoir petit padawan
        if ($ip == $this->HostConn && $userAgent == $this->ClientConn)
        {
            //verif du temps de session
            //si temps > constante de l'appli alors degage et suppression de l'entree en bdd
            $start = time();
            $timestamp1 = (int) $this->DateConn;
            $timestamp2 = $start;
            $delai = abs($timestamp2 - $timestamp1);
            if ((int) $delai > SESSION_TIMEOUT)
            {
                $myBool = false;
            }
            else
            {
                $myBool = true;
            }
        }
        else
        {
            $myBool = false;
        }
        return $myBool;
    }

    /**
     *
     * @param int $id
     */
    public function setIdUtilisateur($id)
    {
        $this->IdMembre = $id;
    }

    /**
     *
     * @return int
     */
    public function getIdUtilisateur()
    {
        return $this->IdMembre;
    }

    /**
     *
     * @param string $myVar
     */
    public function setSID($myVar)
    {
        $this->SessId = $myVar;
    }

    public function setDateDerniereConn()
    {
        $this->DateConn = time();
    }

    /**
     *
     * @param string $myVar
     */
    public function setHost($myVar)
    {
        $this->HostConn = $myVar;
    }

    /**
     *
     * @param string $myVar
     */
    public function setClient($myVar)
    {
        $this->ClientConn = $myVar;
    }

    /**
     *
     * @param int $myVar
     */
    public function setIdMembre($myVar)
    {
        $this->IdMembre = $myVar;
    }

    /**
     *
     * @return string
     */
    public function getSID()
    {
        return $this->SessId;
    }

    /**
     *
     * @return string
     */
    public function getHost()
    {
        return $this - HostConn;
    }

    /**
     *
     * @return string
     */
    public function getClient()
    {
        return $this->ClientConn;
    }

    /**
     *
     * @return int
     */
    public function getIdMembre()
    {
        return $this->IdMembre;
    }

    /**
     *
     * @return int
     */
    public function getDateDerniereConn()
    {
        return $this->DateConn;
    }

    /**
     *
     * @return int
     */
    public function getIdConnHisto()
    {
        return $this->IdConnHisto;
    }

}

?>